#ifndef Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8
#define Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8

/// @file jjwf/xutility/code_convert.hpp
///
/// @brief 提供(gbk,utf-8)(utf8-宽字节)(gbk, 宽字节)之间的编码转换
///     - 不依赖第三方库(iconv, icu)
///     - 这里没有使用boost库，避免boost库在不同平台下的依赖
///
/// @attention
///   - 本文件所提供的转换不适合单次数据量比较大的转换
///
///   - 多字节区域GB编码，使用内部实现，不依赖系统
///       : 中文多字节字符集默认为 GB18030-2005
///       : 内存消耗 GBK约90K，GB18030-2000约143K，GB18030-2005约485K
///       : 如要关闭2005扩展B（适用于移动端，减少内存消耗），需要在编译时宏定义 DISABLE_GB18030_2005_CONV
///            ！ 在VS2010下编译时，编译选项 Zm2000
///
///   - 多字节区域非GB编码，依赖于系统支持。
///
///      1. 查看系统支持编码使用命令  "locale -a"
///      2. win也可看msdn https://docs.microsoft.com/zh-cn/windows/desktop/Intl/code-page-identifiers

#include <cstdint>
#include <string>

namespace jjwf {
namespace codecvt {

/**
 * @name 基于ansi的多字节编码与utf8之间的转换
 * @{
 */
std::string ansi_to_utf8(const std::string& ansi, const char* loc_name);
std::string utf8_to_ansi(const std::string& utf8, const char* loc_name);
/** @} */

/**
  * @brief 基于ansi的中文多字节编码与多字节utf8之间的转换
  *     不依赖系统与第三方库，默认GB18030-2005
  */
std::string gb18030_to_utf8(const std::string& gb);
std::string utf8_to_gb18030(const std::string& utf8);
/** @} */

/**
 * @brief 多字节utf-8与宽字节之间的转换
 */
std::wstring utf8_to_wstr(const std::string& utf8);
std::string  wstr_to_utf8(const std::wstring& wstr);
/** @} */

/**
 * @brief 基于ansi的多字节编码与宽字节之间的转换
 *   依赖于系统
 */
std::wstring ansi_to_wstr(const std::string& ansi, const char* loc_name);
std::string  wstr_to_ansi(const std::wstring& wstr, const char* locale);

/**
 * @brief 基于ansi的"中文"多字节编码与宽字节之间的转换
 *    不依赖系统与第三方库，默认GB18030-2005
 */
std::wstring gb18030_to_wstr(const std::string& gb);
std::string  wstr_to_gb18030(const std::wstring& wstr);

/** @} */


/** @} */





/**
 * @name 废弃的部分，保留兼容
 *
 */
inline
std::string gbk_to_utf8(const std::string& gbk)
{
	return std::move(gb18030_to_utf8(gbk));
}

inline
std::string utf8_to_gbk(const std::string& utf8)
{
	return std::move(utf8_to_gb18030(utf8));
}

inline
std::wstring gbk_to_wstr(const std::string& gb)
{
	return std::move(gb18030_to_wstr(gb));
}

inline
std::string  wstr_to_gbk(const std::wstring& wstr)
{
	return std::move(wstr_to_gb18030(wstr));
}

inline
std::wstring utf8_to_utf16(const std::string& s)
{
	return std::move(utf8_to_wstr(s));
}

inline
std::string utf16_to_utf8(const std::wstring& s)
{
	return std::move(wstr_to_utf8(s));
}

} // end of namespace codecvt
} // end of namespace jjwf

#endif // Header_Guard_GUID__D9D3C54A_F02E_4D49_ADAB_E43683217DD8

